package me.ydq.core.table;

import me.ydq.core.SqlSpec;
import me.ydq.core.Table;
import me.ydq.misc.Fn;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;

public interface TableExtra<T> {

    /**
     * 提供一个 帮你生成好的 "WHERE xxx" 的 SQL 片段 和一个 填充好了对应参数的 Map
     * 以应对一些 特殊复杂的需要利用原始的 NamedParameterJdbcTemplate 查询场景
     * 当没有任何参数时 sql片段为空字符串，没有WHERE，Map 为空
     */
    void useTable(Consumer<TableManual<T>> consumer);

    /**
     * 同上，需要返回值的情况，可以直接 在 lambda 中 return，外层直接 return
     */
    <R> R useTable(Function<TableManual<T>, R> func);

    Table<T> reset();

    Table<T> select(String rawColumns);

    Table<T> select(List<Fn<T, ?>> selectColumns);

    default Table<T> select(Fn<T, ?> column) {
        return select(List.of(column));
    }

    default Table<T> select(Fn<T, ?> column1, Fn<T, ?> column2) {
        return select(List.of(column1, column2));
    }

    default Table<T> select(Fn<T, ?> column1, Fn<T, ?> column2, Fn<T, ?> column3) {
        return select(List.of(column1, column2, column3));
    }

    Table<T> having(Consumer<SqlSpec<T>> builder);

    Table<T> groupBy(List<Fn<T, ?>> columns);

    default Table<T> groupBy(Fn<T, ?> column) {
        return groupBy(List.of(column));
    }

    default Table<T> groupBy(Fn<T, ?> column1, Fn<T, ?> column2) {
        return groupBy(List.of(column1, column2));
    }

    default Table<T> groupBy(Fn<T, ?> column1, Fn<T, ?> column2, Fn<T, ?> column3) {
        return groupBy(List.of(column1, column2, column3));
    }

    Table<T> groupBy(String groupByRaw);
}
